import java.util.ArrayList;

import jbook.util.Input;

/**
 * La classe Admin si occupa di tutto quello che è gestire il mondo di gioco.
 * 
 * @author Gastaldi Francesco & Leonardo Trentin
 * 
 */

public class Admin {

	public final static int ROWS = 7;
	public final static int COLUMS = 7;
	public static int CICLO = 0;
	public static int CLOCK = 0;
	public static Weapon ascia;
	public static Player player;
	public static Prison p;
	public static ArrayList<Inanimate> poz = new ArrayList<Inanimate>();

	/**
	 * Nel main sono presenti la selezione dell'arma, il cliclo principale di
	 * gestione del gioco
	 * 
	 */
	public static void main(String[] args) {
		int x, y;
		ascia = new Weapon("ascia", 30);
		p = new Prison(ROWS, COLUMS);

		int i = 0;
		boolean a = true;
		while (a) {
			System.out
					.println("Scegli l'arma tra le seguenti con cui iniziare l'avventura:");
			System.out.println("1-Spada--->Danno: 35");
			System.out.println("2-Spadone--->Danno: 45");
			System.out.println("3-Arco--->Danno: 25");
			System.out.println("4-Daga--->Danno: 20");
			i = Input.readInt();
			if (i == 1) {
				player = new Player(100, 50, new Weapon("spada", 35));
				a = false;
			} else if (i == 2) {
				player = new Player(100, 50, new Weapon("spadone", 45));
				a = false;
			} else if (i == 3) {
				player = new Player(100, 50, new Weapon("arco", 25));
				a = false;
			} else if (i == 4) {
				player = new Player(100, 50, new Weapon("daga", 20));
				a = false;
			} else {
				System.out.println("Reinserire il numero");
			}
		}

		p.creaStanza();

		char b = 0;
		do {
			p.visualizzaStanzaCompleta();
			System.out.print("\n");
			System.out.println("Scegli dove muovere il giocatore:");
			System.out.println("+-----+------+-----+--+-----+        +");
			System.out.println("| Q   | W    | E   |  | P   |        |Life: "
					+ player.getLife());
			System.out.println("| UL  | UP   | UR  |  | Exit|        |");
			System.out.println("+-----|------|-----|  |-----|        |");
			System.out.println("| A   |  S   | D   |  | L   |        |Force: "
					+ player.getForce());
			System.out.println("| L   | STOP | R   |  | Load|        |");
			System.out.println("+-----|------|-----|  |-----|        |");
			System.out.println("| Z   |  X   | C   |  | M   |        |Weapon: "
					+ player.getWeapon().tipo);
			System.out.println("| DL  |  D   | DR  |  | Save|        |");
			System.out.println("+-----+------+-----+--+-----+        +");
			b = Input.readChar();
			switch (b) {
			case 'w': // caso moveup
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!((x - 1) == -1)) && (!(p.findWall(x - 1, y)))) {
					if (p.victory(x - 1, y)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x - 1, y)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x - 1, y));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.moveUp(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'x': // caso movedown
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!((x + 1) == ROWS)) && (!(p.findWall(x + 1, y)))) {
					if (p.victory(x + 1, y)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x + 1, y)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x + 1, y));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.moveDown(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'd': // caso moveright
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!((y + 1) == COLUMS)) && (!(p.findWall(x, y + 1)))) {
					if (p.victory(x, y + 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x, y + 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x, y + 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.moveRight(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'a': // caso moveleft
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!((y - 1) == -1)) && (!(p.findWall(x, y - 1)))) {
					if (p.victory(x, y - 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x, y - 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x, y - 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.moveLeft(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'q': // caso upleft
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!(((y - 1) == -1) || ((x - 1) == -1)))
						&& (!(p.findWall(x - 1, y - 1)))) {
					if (p.victory(x - 1, y - 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x - 1, y - 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x - 1,
								y - 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.upLeft(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'e': // caso upright
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!(((x - 1) == -1) || ((y + 1) == COLUMS)))
						&& (!(p.findWall(x - 1, y + 1)))) {
					if (p.victory(x - 1, y + 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x - 1, y + 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x - 1,
								y + 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.upRight(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'z': // caso downleft
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!(((y - 1) == -1) || ((x + 1) == ROWS)))
						&& (!(p.findWall(x + 1, y - 1)))) {
					if (p.victory(x + 1, y - 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x + 1, y - 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x + 1,
								y - 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.downLeft(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 'c': // caso downright
				x = p.getPosx(player);
				y = p.getPosy(player);
				if ((!(((y + 1) == COLUMS) || ((x + 1) == ROWS))) && (!(p.findWall(x + 1, y + 1)))) {
					if (p.victory(x + 1, y + 1)) {
						b = 'k';
						System.out.println("Ti sei mosso!");
						player.powerUP();
					} else if (p.findMonster(x + 1, y + 1)) {
						System.out.println("C'è un mostro");
						player.combattimento((Actor) Prison.getEl(x + 1,
								y + 1));
						System.out.println("Ti sei mosso!");
						player.powerUP();
					}
					player.downRight(x, y);
				}
				Monster.moveMonster();
				CICLO++;
				break;
			case 's':
				System.out.println("Nessun movimento!");
				break;
			case 'p':
				b = 'p';
				break;
			case 'm':
				p.save();
				System.out.println("Stato del gioco salvato con successo!");
				break;
			case 'l':
				p.load();
				System.out.println("Caricato con successo!");
				break;
			default:
				System.out.println("Riprovare!");
				break;
			}
			rimuoviMostri();
			if (CICLO % 3 == 0)
				CLOCK++;
			if ((player.getLife() == 0) || (player.getLife() < 0)) {
				b = 'p';
				System.out.println("Hai perso");
			}

		} while ((b != 'p') && (b != 'k'));

		if (b == 'k') {
			System.out.println("Hai vinto!");
			p.visualizzaStanzaCompleta();
		}
	}
	
	public static void rimuoviMostri() {
		for (int x = 0; x < ROWS; x++) {
			for (int y = 0; y < COLUMS; y++) {
				if (Prison.getEl(x, y) instanceof Monster) {
					Monster morto = (Monster) Prison.getEl(x, y);
					if (morto.getLife() <= 0) {
						Prison.setEl(x, y, new Empty());
					}
				}
			}
		}
	}
}